package com.sunshine.homepage.service.impl;

import com.sunshine.homepage.dao.ProductsDao;
import com.sunshine.homepage.entity.Products;
import com.sunshine.homepage.service.MerchantUpdateService;

import com.sunshine.util.minio.MinIOUtil;
import com.sunshine.util.TokenUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import sunshine.commcon.util.entity.Result;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

@Service
public class MerchantUpdateServiceImpl implements MerchantUpdateService {
    private static final Logger log = LoggerFactory.getLogger(MerchantUpdateServiceImpl.class);
    @Resource
    private ProductsDao productsDao;
    
    @Resource
    private MinIOUtil minIOUtil;
    
    // 添加ObjectMapper用于JSON序列化
    private final ObjectMapper objectMapper = new ObjectMapper();

    
    /**
     * 添加商品信息（带图片上传）
     * 上传商品图片到MinIO，并将图片URL保存到商品信息中，最后保存到数据库
     * 
     * @param products 商品信息对象
     * @param imageFile 主图文件
     * @param imageFiles 详情图文件列表
     * @return 操作结果，成功返回true，失败返回错误信息
     */
    @Override
    public Result<Boolean> addProductsWithImages(Products products, MultipartFile imageFile, MultipartFile[] imageFiles) {
        try {
            log.info("添加商品（带图片）: {}", products);
            
            // 上传主图
            if (imageFile != null && !imageFile.isEmpty()) {
                if (minIOUtil == null) {
                    log.error("MinIOUtil 未正确注入，无法上传主图");
                    return Result.fail("系统配置错误，文件服务不可用");
                }
                String imageUrl = minIOUtil.uploadFile(imageFile, "products/main/");
                if (imageUrl == null || imageUrl.isEmpty()) {
                    log.warn("上传主图失败，返回的URL为空");
                    return Result.fail("主图上传失败");
                }
                products.setImageUrl(imageUrl);
            }
            
            // 上传详情图列表
            if (imageFiles != null && imageFiles.length > 0) {
                List<String> imageUrls = new ArrayList<>();
                for (MultipartFile file : imageFiles) {
                    if (file != null && !file.isEmpty()) {
                        if (minIOUtil == null) {
                            log.error("MinIOUtil 未正确注入，无法上传详情图");
                            return Result.fail("系统配置错误，文件服务不可用");
                        }
                        String imageUrl = minIOUtil.uploadFile(file, "products/detail/");
                        if (imageUrl != null && !imageUrl.isEmpty()) {
                            imageUrls.add(imageUrl);
                        } else {
                            log.warn("上传详情图失败: {}", file.getOriginalFilename());
                        }
                    }
                }
                // 将图片URL列表转换为JSON字符串存储到products对象中
                if (!imageUrls.isEmpty()) {
                    try {
                        String imageListJson = objectMapper.writeValueAsString(imageUrls);
                        products.setImageList(imageListJson);
                    } catch (JsonProcessingException e) {
                        log.error("序列化图片URL列表为JSON失败", e);
                        return Result.fail("处理图片列表失败");
                    }
                }
            }
            products.setCreatedAt(new Date());
            // 保存商品信息到数据库
            productsDao.insert(products);
            log.info("已添加商品: {}", products);
            return Result.ok(true);
        } catch (Exception e) {
            log.error("添加商品（带图片）失败", e);
            return Result.fail("添加商品失败: " + e.getMessage());
        }
    }

    /**
     * 删除商品信息
     * 从数据库中删除商品记录，并同步删除MinIO中关联的图片文件
     * 
     * @param products 商品信息对象，必须包含商品ID
     * @return 操作结果，成功返回true，失败返回错误信息
     */
    @Override
    public Result<Boolean> deleteProducts(Products products) {
        try {
            log.info("删除商品: {}", products);
            
            // 先从数据库中查询完整的商品信息，以获取图片URL
            Products fullProduct = productsDao.queryById(products.getProductId());
            // 删除主图
            if (fullProduct != null && fullProduct.getImageUrl() != null && !fullProduct.getImageUrl().isEmpty()) {
                // 从URL中提取对象名称
                String imageUrl = fullProduct.getImageUrl();
                String objectName = extractObjectNameFromUrl(imageUrl);
                if (objectName != null) {
                    if (minIOUtil != null) {
                        minIOUtil.deleteFile(objectName);
                        log.info("已删除主图: {}", objectName);
                    } else {
                        log.error("MinIOUtil 未正确注入，跳过删除主图");
                    }
                }
            }
            
            // 删除详情图
            if (fullProduct != null && fullProduct.getImageList() != null) {
                // 解析imageList并删除每个图片
                Object imageListObj = fullProduct.getImageList();
                if (imageListObj instanceof String) {
                    try {
                        List<String> imageList = objectMapper.readValue((String) imageListObj, List.class);
                        for (String imageUrl : imageList) {
                            String objectName = extractObjectNameFromUrl(imageUrl);
                            if (objectName != null) {
                                if (minIOUtil != null) {
                                    minIOUtil.deleteFile(objectName);
                                    log.info("已删除详情图: {}", objectName);
                                } else {
                                    log.error("MinIOUtil 未正确注入，跳过删除详情图");
                                }
                            }
                        }
                    } catch (JsonProcessingException e) {
                        log.warn("解析imageList JSON失败", e);
                    }
                }
            }
            
            // 从数据库中删除商品记录
            productsDao.deleteProducts(products);
            return Result.ok(true);
        } catch (Exception e) {
            log.error("删除商品失败", e);
            return Result.fail("删除商品失败: " + e.getMessage());
        }
    }

    @Override
    public Result<List<Products>> findProducts(Products products, int page, int size) {
        //有条件分页查询 - 根据商家ID查询商品
        Pageable pageable = PageRequest.of(page, size);
        List<Products> products1 = productsDao.queryAllByLimit(products, pageable);
        return Result.ok(products1);
    }

    @Override
    public Result<Boolean> updateProducts(Products products) {

        try {
            log.info("更新商品信息: {}", products);
            productsDao.update(products);
        } catch (Exception e) {
            log.error("更新商品信息失败", e);
            return Result.fail("更新商品信息失败: " + e.getMessage());
        }
        return Result.ok(true);

    }

    @Override
    public Result<Integer> findProductIdByName(String  productName , Long merchantId ) {
        log.info("商品名: {} {}", productName , merchantId);
        return Result.ok(productsDao.findProductIdByName(productName, merchantId));

    }

    /**
     * 从MinIO的预签名URL中提取对象名称
     *
     * @param url 预签名URL
     * @return 对象名称
     */
    private String extractObjectNameFromUrl(String url) {
        if (url == null || url.isEmpty()) {
            return null;
        }
        try {
            // 查找bucket名称后的位置
            String bucketName = "sunshine-shopping";
            int bucketIndex = url.indexOf("/" + bucketName + "/");
            if (bucketIndex != -1) {
                String objectPart = url.substring(bucketIndex + bucketName.length() + 2);
                int paramIndex = objectPart.indexOf("?");
                if (paramIndex != -1) {
                    objectPart = objectPart.substring(0, paramIndex);
                }
                return objectPart;
            }
        } catch (Exception e) {
            log.warn("从URL提取对象名称失败: {}", url, e);
        }
        return null;
    }



}